
////////air-conditioning //////////
////   ////air-conditioning Air conditioner--- HVAC是Heating, Ventilation and Air Conditioning  

// AC485空调控制器
// 传感器名称	功能	目标值
// AC485空调控制器	开关	开/关
// 	模式	制冷//	制热 //出湿
// 	风速	增强// 		减弱
// 	温度	加// 		减


//#include  "iotv30_config.h"


#include "cjson_api_readAttr.h"
#include "iot_node_func.h"
#include "iotv30_config.h"
#include "test_mode.h"
// #include "iot_node.h"

#include "uart_printf.h"
#include <string.h>

#include "dev_air_cond.h"


// typedef enum{
//     air_cond_index_run_data_begin      = 0,    // 设备运行参数
//     air_cond_index_config_data_begin   = 12,    // 设备配置参数-------------超过 8个时需要分帧处理
//     air_cond_index_factory_info_begin  = 26,   // 设备出厂信息
//     air_cond_index_end = 30+1,

// } air_cond_attr_index_e;



////注意：改变 数组 air_cond_iot_id_table[air_cond_index_end]的定义-----需要同步更新  枚举变量的定义 air_cond_attr_index_e-------
const  uint16_t  air_cond_iot_id_table[air_cond_index_end]=
{
    //iot_id(hex)	,	name	R/W	变化上报	分类	数据类型	范围	单位	默认值		
    //	运行参数						
    0x0900	,//	intT	内置温度	RO	运行参数	int16_t  2304
    // 0x0901	,//	intH	内置湿度	RO	运行参数	int16_t
    // 0x0902	,//	extT	外接温度	RO	运行参数	int16_t
    // 0x0903	,//	extH	外接湿度	RO	运行参数	int16_t
    0x0904	,//	acCurr	空调电流	RO	运行参数	int32_t
    0x0905	,//	acStatus	空调状态	RO	运行参数	int16_t
    0x0906	,//	almStatus	告警状态	RO	运行参数	int16_t
    0x0907	,//	acCtrlStatus	空调控制开关状态	RO	运行参数	int16_t
    0x0908	,//	acCtrlMode	空调控制模式	RO	运行参数	int16_t
    0x0909	,//	acCtrlFanSpeed	空调控制风速状态	RO	运行参数	int16_t
    0x090A	,//	acSwingStatus	空调控制摆风方式状态	RO	运行参数	int16_t
    0x090B	,//	acTempeStatus	空调控制温度状态	RO	运行参数	int16_t			

      //配置参数	  
    0x090F	,//	energySaveTempe	节能控制发码温度	R/W	配置参数	int16_t
    0x0910	,//	energySaveFanSpeed	节能控制发码风速	R/W	配置参数	int16_t
    0x0911	,//	acStatusDetectMode	空调状态检测方式选择	R/W	配置参数	int16_t
   
    0x0913	,//	do	do控制寄存器	R/W	运行参数	int8_t
    0x0914	,//	di	di状态	R/W	运行参数	int8_t
    0x0915	,//	doFuncSel	DO功能选择	R/W	配置参数	int8_t
    0x0916	,//	diFuncSel	di功能选择	R/W	配置参数	int8_t
    0x0917	,//	diCtrlSel	di输入状态对应控制或空调状态选择	R/W	配置参数	int8_t		
    0x091B	,//	pwrOnAutoStart	来电自启动标志	R/W	配置参数	int8_t
    0x091C	,//	buzzerFunc	蜂鸣器功能选择	R/W	配置参数	int8_t
    0x091D	,//	coolWarmMode	制冷制热模式选择	R/W	配置参数	int8_t---0: 制冷，1：制热
    0x091E	,//	acStatusTH	状态判断阈值	R/W	配置参数	int8_t
    0x091F	,//	acPwrOnOffTime	空调开关机时长	R/W	配置参数	int8_t
    0x0920	,//	ctrlMode	控制模式	R/W	配置参数	int8_t

///-------vre.1.27------------------
    0x0928,//2344	diCtrlMinPwrOnTime	di控制最小开机时间	R/W
    0x0929,//2345	diCtrlMinTrigTime	di控制最小触发时间	R/W
    0x092A,//2346	teHuAlmTime	温湿度告警判断时长	R/W
    0x092B,//2347	resetRecover	重启/恢复出厂设置	W		控制	int16_t				2：重启， 4：恢复出厂设置
    0x092C,//2348	learnIr	学习红外码	W		控制	int16_t				高字节功能， 低字节温度（看空调物模型说明.txt）
    0x092D,//2349	sendIr	发送红外码	W		控制	int16_t				高字节功能， 低字节温度（看空调物模型说明.txt）
    0x092E,//2350	remoteCode	遥控对码	R/W		控制	int16_t				
    0x092F,//2351	remoteCtrlKey	遥控发码控制按钮	W		控制	int16_t	1~20 发自定义码1~20 ， 0x400：开关， 0x500：模式， 0x600：风速，0x700：摆风，0x800：温度加，0x900：温度减，0xa00：开机， 0xb00：关机
    

    //产品信息						
    0x0801	,//	软件版本	RO	否	软件版本	string	最大32字节	
    0x0802	,//	硬件版本	RO	否	硬件版本	string	最大32字节	
    0x0803	,//	产品型号	RO	否	产品型号	string	最大32字节	
    0x0804	,//	生产信息	RO	否	生产信息	string	最大32字节	
    0x0805	,//	厂家信息	RO	否		       string  最大32字节	

};





 static air_cond_attr_t air_cond_obj[AIR_COND_NODE_NUM_MAX];   /////下标与 配置节点数据结构一一对应 iot_NodeConfigObj_u   iot_NodeConfigObj;


static  air_cond_attr_t air_cond_attr_default={


/////------测试数据-------------------------
 //   .data.level_mm = 50728, //0.01mm



/////------56H	版本号‘V’--------------
    .info.soft_ver="sV2.0",
    .info.hard_ver="hV2.0",// 

    .info.product_model="JTY-GD-ZS209",       //
    .info.production_info="rs485",    //// 485型
    .info.manufacturer="PRSS",     //


    .config={//default value, do not delete

        .alarm_enable.bit={    /////报警使能无效
            .en  = 1,
           },

    },


};






/**
 * @brief 
 * 
 */
void air_cond_param_init(void)
{
 #if 0   
    snprintf(air_cond_attr.info.soft_ver, sizeof(air_cond_attr.info.soft_ver),"%s sv%04X %s",SDK_VER_STR,app_get_ver(),__DATE__);
    snprintf(air_cond_attr.info.hard_ver, sizeof(air_cond_attr.info.hard_ver),"%s",HARDWARE_STR);
    snprintf(air_cond_attr.info.production_info, sizeof(air_cond_attr.info.production_info),"%s","2024-08-p01");
#endif

}



//还需要检测配置参数是否合理----设备地址，通道编号---量程
uint8_t air_cond_add_obj(uint8_t idx,uint8_t channel,uint8_t addr)
{

//还需要检测配置参数是否合理----设备地址，通道编号---量程
//  air_cond_max_scale_0_01mm   (100000U)    //1000mm===1000x100 (0.01mm)

    LOG_NAME();

   if( (addr>air_cond_max_dev_addr) || (channel>air_cond_max_channel) )
   {
        return 0;
   }



    air_cond_attr_default.config.addr    = addr;
    air_cond_attr_default.config.channel = channel;

    air_cond_set_obj( idx, (air_cond_attr_t*)&air_cond_attr_default ) ; 

 return 1;

}




/**
 * @brief 根据下标，获取iot_id 的编号
 * 
 * @param idx 
 */
uint16_t  air_cond_get_iot_id(uint8_t idx)
{
    return  air_cond_iot_id_table[idx] ;
}




/**
 * @brief 
 * 
 * @param in idx 
 * @return air_cond_attr_t ==NULL 查询出错,   !NULL 查询ok
 */
air_cond_attr_t*  air_cond_get_obj(uint8_t idx)   
{
    return  &air_cond_obj[idx];
}



/**
 * @brief air_cond_set_obj() 赋值节点数据
 * 
 * @param in idx
 * @param in p_attr
 * @return 0=失败，1=成功 
 */
uint8_t  air_cond_set_obj(uint8_t idx,air_cond_attr_t* p_attr )  
{
    if( idx>=AIR_COND_NODE_NUM_MAX )
    {
        return 0;
    } 

    air_cond_obj[idx] = *p_attr;

 return 1 ;

}




/**
 * @brief 
 * 
 * @param attr_id 
 * @param attr_out 
 */
void air_cond_get_attr(uint8_t idx,uint16_t attr_id, IotModel* attr_out)
{
    attr_out->iot_id = attr_id;//传给服务器
    

    if( idx > AIR_COND_NODE_NUM_MAX )
    {
       logout("error:air_cond idx outof range\n"); 
       return ;
    }


    switch(attr_id)
    {
        //////---------RO--------------------------//////////////////////

        case 0x0900	://	intT	内置温度	RO	运行参数	int16_t
        {
            attr_out->value = air_cond_obj[idx].data.intT;
        }  break;

        case 0x0901	://	intH	内置湿度	RO	运行参数	int16_t
        {
            attr_out->value = air_cond_obj[idx].data.intH;
        }  break;

        case 0x0902	://	extT	外接温度	RO	运行参数	int16_t
        {
            attr_out->value = air_cond_obj[idx].data.extT;
        }  break;

        case 0x0903	://	extH	外接湿度	RO	运行参数	int16_t
        {
            attr_out->value = air_cond_obj[idx].data.extH;
        }  break;

        case 0x0904	://	acCurr	空调电流	RO	运行参数	int32_t
        {
            attr_out->value = air_cond_obj[idx].data.acCurr;
        }  break;

        case 0x0905	://	acStatus	空调状态	RO	运行参数	int16_t
        {
            attr_out->value = air_cond_obj[idx].data.acStatus;
        }  break;

        case 0x0906	://	almStatus	告警状态	RO	运行参数	int16_t
        {
            attr_out->value = air_cond_obj[idx].data.almStatus;
        }  break;

        case 0x0907	://	acCtrlStatus	空调控制开关状态	RO	运行参数	int16_t
        {
            attr_out->value = air_cond_obj[idx].data.acCtrlStatus;
        }  break;

        case 0x0908	://	acCtrlMode	空调控制模式	RO	运行参数	int16_t
        {
            attr_out->value = air_cond_obj[idx].data.acCtrlMode;
        }  break;

        case 0x0909	://	acCtrlFanSpeed	空调控制风速状态	RO	运行参数	int16_t
        {
            attr_out->value = air_cond_obj[idx].data.acCtrlFanSpeed;
        }  break;

        case 0x090A	://	acSwingStatus	空调控制摆风方式状态	RO	运行参数	int16_t
        {
            attr_out->value = air_cond_obj[idx].data.acSwingStatus;
        }  break;

        case 0x090B	://	acTempeStatus	空调控制温度状态	RO	运行参数	int16_t			
        {
            attr_out->value = air_cond_obj[idx].data.acTempeStatus;
        }  break;


        //////---------RO--------------------------//////////////////////

        //////---------R/W--------------------------//////////////////////

       //----------------配置参数-------------	  
        case 0x090F	://	energySaveTempe	节能控制发码温度	R/W	配置参数	int16_t
        {
            attr_out->value = air_cond_obj[idx].config.energySaveTempe;
        }  break;

        case 0x0910	://	energySaveFanSpeed	节能控制发码风速	R/W	配置参数	int16_t
        {
            attr_out->value = air_cond_obj[idx].config.energySaveFanSpeed;
        }  break;

        case 0x0911	://	acStatusDetectMode	空调状态检测方式选择	R/W	配置参数	int16_t
        {
            attr_out->value = air_cond_obj[idx].config.acStatusDetectMode;
        }  break;

        case 0x0913	://	do	do控制寄存器	R/W	运行参数	int8_t
        {
            attr_out->value = air_cond_obj[idx].config.DO;
        }  break;

        case 0x0914	://	di	di状态	R/W	运行参数	int8_t
        {
            attr_out->value = air_cond_obj[idx].config.DI;
        }  break;

        case 0x0915	://	doFuncSel	DO功能选择	R/W	配置参数	int8_t
        {
            attr_out->value = air_cond_obj[idx].config.doFuncSel;
        }  break;

        case 0x0916	://	diFuncSel	di功能选择	R/W	配置参数	int8_t
        {
            attr_out->value = air_cond_obj[idx].config.diFuncSel;
        }  break;

        case 0x0917	://	diCtrlSel	di输入状态对应控制或空调状态选择	R/W	配置参数	int8_t		
        {
            attr_out->value = air_cond_obj[idx].config.diCtrlSel;
        }  break;

        case 0x091B	://	pwrOnAutoStart	来电自启动标志	R/W	配置参数	int8_t
        {
            attr_out->value = air_cond_obj[idx].config.pwrOnAutoStart;
        }  break;

        case 0x091C	://	buzzerFunc	蜂鸣器功能选择	R/W	配置参数	int8_t
        {
            attr_out->value = air_cond_obj[idx].config.buzzerFunc;
        }  break;

        case 0x091D	://	coolWarmMode	制冷制热模式选择	R/W	配置参数	int8_t
        {
            attr_out->value = air_cond_obj[idx].config.coolWarmMode;
        }  break;

        case 0x091E	://	acStatusTH	状态判断阈值	R/W	配置参数	int8_t
        {
            attr_out->value = air_cond_obj[idx].config.acStatusTH;
        }  break;

        case 0x091F	://	acPwrOnOffTime	空调开关机时长	R/W	配置参数	int8_t
        {
            attr_out->value = air_cond_obj[idx].config.acPwrOnOffTime;
        }  break;

        case 0x0920	://	ctrlMode	控制模式	R/W	配置参数	int8_t
        {
            attr_out->value = air_cond_obj[idx].config.ctrlMode;
        }  break;


        ///-------vre.1.27------------------
        case 0x0928://2344	diCtrlMinPwrOnTime	di控制最小开机时间	R/W
        {
            attr_out->value = air_cond_obj[idx].config.diCtrlMinPwrOnTime;
        }break;

        case 0x0929://2345	diCtrlMinTrigTime	di控制最小触发时间	R/W
        {
            attr_out->value = air_cond_obj[idx].config.diCtrlMinTrigTime;
        }break;

        case 0x092A://2346	teHuAlmTime	温湿度告警判断时长	R/W
        {
            attr_out->value = air_cond_obj[idx].config.teHuAlmTime;
        }break;

        case 0x092B://2347	resetRecover	重启/恢复出厂设置	W		控制	int16_t				2：重启， 4：恢复出厂设置
        {
            attr_out->value = air_cond_obj[idx].config.resetRecover;
        }break;

        case 0x092C://2348	learnIr	学习红外码	W		控制	int16_t				高字节功能， 低字节温度（看空调物模型说明.txt）
        {
            attr_out->value = air_cond_obj[idx].config.learnIr;
        }break;

        case 0x092D://2349	sendIr	发送红外码	W		控制	int16_t				高字节功能， 低字节温度（看空调物模型说明.txt）
        {
            attr_out->value = air_cond_obj[idx].config.sendIr;
        }break;

        case 0x092E://2350	remoteCode	遥控对码	R/W		控制	int16_t				
        {
            attr_out->value = air_cond_obj[idx].config.remoteCode;
        }break;

        case 0x092F://2351	remoteCtrlKey	遥控发码控制按钮	W		控制	int16_t	1~20 发自定义码1~20 ， 0x400：开关， 0x500：模式， 0x600：风速，0x700：摆风，0x800：温度加，0x900：温度减，0xa00：开机， 0xb00：关机
        {
            attr_out->value = air_cond_obj[idx].config.remoteCtrlKey;
        }break;

        ///-------vre.1.27------------------

        //////---------R/W--------------------------//////////////////////
        case 0x0600:
        {
            attr_out->value = air_cond_obj[idx].config.addr;
        }  break;

        case 0x0602:
        {
            attr_out->value = air_cond_obj[idx].config.channel;
        }  break;


        //////---------R/W--------------------------//////////////////////



// 0x0801	软件版本
// 0x0802	硬件版本
// 0x0803	产品型号
// 0x0804	生产信息
// 0x0805	厂家信息

        //////---------RO--------------------------//////////////////////
        // case 0x0800://0x0800	产品类型	RO	否	产品类型	uint16_t
        // {
        //     attr_out->value = CTK_PID;
        // }  break;

        case 0x0801:
        {
            attr_out->values.size = strlen(air_cond_obj[idx].info.soft_ver);
            strncpy((char*)attr_out->values.bytes,air_cond_obj[idx].info.soft_ver,32);
        }  break;
        case 0x0802:
        {
            attr_out->values.size = strlen(air_cond_obj[idx].info.hard_ver);
            strncpy((char*)attr_out->values.bytes,air_cond_obj[idx].info.hard_ver,32);
        }  break;

        case 0x0803:
        {
            attr_out->values.size = strlen(air_cond_obj[idx].info.product_model);
            strncpy((char*)attr_out->values.bytes,air_cond_obj[idx].info.product_model,32);
        }  break;

        case 0x0804:
        {
            attr_out->values.size = strlen(air_cond_obj[idx].info.production_info);
            strncpy((char*)attr_out->values.bytes,air_cond_obj[idx].info.production_info,32);
        }  break;

        case 0x0805:
        {
            attr_out->values.size = strlen(air_cond_obj[idx].info.manufacturer);
            strncpy((char*)attr_out->values.bytes,air_cond_obj[idx].info.manufacturer,32);
        }  break;
        //////---------RO--------------------------//////////////////////


       default: 
           break;

    }

}

/**
 * @brief 
 * 
 * @param attr_in 
 * @return uint8_t 
 */
uint8_t air_cond_set_attr(uint8_t idx,IotModel* attr)
{
uint8_t ret  = 0;

//dev_mod_info_t info;


    //printf_log(lv0,"set addr %04X, value = %d\n", attr->iot_id, attr->value);////printf_log

    logout("set addr %04X, value = %lu\n", attr->iot_id, attr->value);

    if( idx > AIR_COND_NODE_NUM_MAX )
    {
       logout("error:air_cond idx outof range\n"); 
       return 0;
    }

   //  memset((uint8_t*)&info,0,sizeof(dev_mod_info_t ) );

    // info.node_type = 1;
    // info.channel   = 2;
    // info.chan_addr = 1;

 //    iot_get_mod_info_with_index( idx ,&info);
//got info: chan_addr=1,channel=2,node_type=53254,indx=1
  // info.node_type = 1;

    switch( attr->iot_id )
    {

        //////--------对与上行是只读-RO-----------对与下行是只写-WO--------------------//////////////////////

        //////---------R/W--------------------------//////////////////////
        case 0x0600:
        {
            air_cond_obj[idx].config.addr = attr->value;   /////还需要保存
           // ret  = iot_Node_WriteSensor_one(  1,  0x12, 4,  attr->iot_id,  attr->value);
            ret  = 1;
        }  break;

        case 0x0602://0x0602	烟雾设备通道编号
        {
            air_cond_obj[idx].config.channel = attr->value;

           // ret  = iot_Node_WriteSensor_one(  1,  0x12, 4,  attr->iot_id,  attr->value);
             //ret  = json_write_setAttr_dev( &info,"oilLevel_2_1","mbAddr" ,  attr->value );
            ret  = 1;
        }  break;


   //////---------RO--------------------------//////////////////////

        case 0x0900	://	intT	内置温度	RO	运行参数	int16_t
        {
            air_cond_obj[idx].data.intT  = attr->value;
        }  break;

        case 0x0901	://	intH	内置湿度	RO	运行参数	int16_t
        {
            air_cond_obj[idx].data.intH  = attr->value;
        }  break;

        case 0x0902	://	extT	外接温度	RO	运行参数	int16_t
        {
            air_cond_obj[idx].data.extT  = attr->value;
        }  break;

        case 0x0903	://	extH	外接湿度	RO	运行参数	int16_t
        {
            air_cond_obj[idx].data.extH  = attr->value;
        }  break;

        case 0x0904	://	acCurr	空调电流	RO	运行参数	int32_t
        {
            air_cond_obj[idx].data.acCurr  = attr->value;
        }  break;

        case 0x0905	://	acStatus	空调状态	RO	运行参数	int16_t
        {
            air_cond_obj[idx].data.acStatus  = attr->value;
        }  break;

        case 0x0906	://	almStatus	告警状态	RO	运行参数	int16_t
        {
            air_cond_obj[idx].data.almStatus  = attr->value;
        }  break;

        case 0x0907	://	acCtrlStatus	空调控制开关状态	RO	运行参数	int16_t
        {
            air_cond_obj[idx].data.acCtrlStatus  = attr->value;
        }  break;

        case 0x0908	://	acCtrlMode	空调控制模式	RO	运行参数	int16_t
        {
            air_cond_obj[idx].data.acCtrlMode  = attr->value;
        }  break;

        case 0x0909	://	acCtrlFanSpeed	空调控制风速状态	RO	运行参数	int16_t
        {
            air_cond_obj[idx].data.acCtrlFanSpeed  = attr->value;
        }  break;

        case 0x090A	://	acSwingStatus	空调控制摆风方式状态	RO	运行参数	int16_t
        {
            air_cond_obj[idx].data.acSwingStatus  = attr->value;
        }  break;

        case 0x090B	://	acTempeStatus	空调控制温度状态	RO	运行参数	int16_t			
        {
            air_cond_obj[idx].data.acTempeStatus  = attr->value;
        }  break;


        //////---------RO--------------------------//////////////////////

        //////---------R/W--------------------------//////////////////////

       //----------------配置参数-------------	  
        case 0x090F	://	energySaveTempe	节能控制发码温度	R/W	配置参数	int16_t
        {
            air_cond_obj[idx].config.energySaveTempe  = attr->value;
        }  break;

        case 0x0910	://	energySaveFanSpeed	节能控制发码风速	R/W	配置参数	int16_t
        {
            air_cond_obj[idx].config.energySaveFanSpeed  = attr->value;
        }  break;

        case 0x0911	://	acStatusDetectMode	空调状态检测方式选择	R/W	配置参数	int16_t
        {
            air_cond_obj[idx].config.acStatusDetectMode  = attr->value;
        }  break;

        case 0x0913	://	do	do控制寄存器	R/W	运行参数	int8_t
        {
            air_cond_obj[idx].config.DO  = attr->value;
        }  break;

        case 0x0914	://	di	di状态	R/W	运行参数	int8_t
        {
            air_cond_obj[idx].config.DI  = attr->value;
        }  break;

        case 0x0915	://	doFuncSel	DO功能选择	R/W	配置参数	int8_t
        {
            air_cond_obj[idx].config.doFuncSel  = attr->value;
        }  break;

        case 0x0916	://	diFuncSel	di功能选择	R/W	配置参数	int8_t
        {
            air_cond_obj[idx].config.diFuncSel  = attr->value;
        }  break;

        case 0x0917	://	diCtrlSel	di输入状态对应控制或空调状态选择	R/W	配置参数	int8_t		
        {
            air_cond_obj[idx].config.diCtrlSel  = attr->value;
        }  break;

        case 0x091B	://	pwrOnAutoStart	来电自启动标志	R/W	配置参数	int8_t
        {
            air_cond_obj[idx].config.pwrOnAutoStart  = attr->value;
        }  break;

        case 0x091C	://	buzzerFunc	蜂鸣器功能选择	R/W	配置参数	int8_t
        {
            air_cond_obj[idx].config.buzzerFunc  = attr->value;
        }  break;

        case 0x091D	://	coolWarmMode	制冷制热模式选择	R/W	配置参数	int8_t
        {
            air_cond_obj[idx].config.coolWarmMode  = attr->value;
        }  break;

        case 0x091E	://	acStatusTH	状态判断阈值	R/W	配置参数	int8_t
        {
            air_cond_obj[idx].config.acStatusTH  = attr->value;
        }  break;

        case 0x091F	://	acPwrOnOffTime	空调开关机时长	R/W	配置参数	int8_t
        {
            air_cond_obj[idx].config.acPwrOnOffTime  = attr->value;
        }  break;

        case 0x0920	://	ctrlMode	控制模式	R/W	配置参数	int8_t
        {
            air_cond_obj[idx].config.ctrlMode  = attr->value;
        }  break;

        //////---------R/W--------------------------//////////////////////




        ///-------vre.1.27------------------
        case 0x0928://2344	diCtrlMinPwrOnTime	di控制最小开机时间	R/W
        {
            air_cond_obj[idx].config.diCtrlMinPwrOnTime = attr->value;
        }break;

        case 0x0929://2345	diCtrlMinTrigTime	di控制最小触发时间	R/W
        {
            air_cond_obj[idx].config.diCtrlMinTrigTime = attr->value;
        }break;

        case 0x092A://2346	teHuAlmTime	温湿度告警判断时长	R/W
        {
            air_cond_obj[idx].config.teHuAlmTime = attr->value;
        }break;

        case 0x092B://2347	resetRecover	重启/恢复出厂设置	W		控制	int16_t				2：重启， 4：恢复出厂设置
        {
            air_cond_obj[idx].config.resetRecover = attr->value;
        }break;

        case 0x092C://2348	learnIr	学习红外码	W		控制	int16_t				高字节功能， 低字节温度（看空调物模型说明.txt）
        {
            air_cond_obj[idx].config.learnIr = attr->value;
        }break;

        case 0x092D://2349	sendIr	发送红外码	W		控制	int16_t				高字节功能， 低字节温度（看空调物模型说明.txt）
        {
            air_cond_obj[idx].config.sendIr = attr->value;
        }break;

        case 0x092E://2350	remoteCode	遥控对码	R/W		控制	int16_t				
        {
            air_cond_obj[idx].config.remoteCode = attr->value;
        }break;

        case 0x092F://2351	remoteCtrlKey	遥控发码控制按钮	W		控制	int16_t	1~20 发自定义码1~20 ， 0x400：开关， 0x500：模式， 0x600：风速，0x700：摆风，0x800：温度加，0x900：温度减，0xa00：开机， 0xb00：关机
        {
            air_cond_obj[idx].config.remoteCtrlKey = attr->value;
        }break;

        ///-------vre.1.27------------------
        

       default: 
           break;

    }

 return ret;

}



#define  air_cond_scale_step           (25U)

void air_cond_test_tick_min(uint8_t idx)
{
static uint32_t cnt = 0;
  IotModel attr;
    memset(&attr, 0,  sizeof(IotModel) );

   LOG_NAME();
/////------测试数据-------------------------
    // .data.level_mm = 50728, //0.01mm
    // .data.temper   = 37,    //温度  1℃ 


// 0x0500	烟雾报警信息
    attr.iot_id =0x0500;
    attr.value =0x0000;
    air_cond_set_attr(idx, &attr); 


// 0x0501	烟雾
    attr.iot_id =0x0501;

   if(cnt < air_cond_max_scale_0_01mm/air_cond_scale_step)
   {
       attr.value = air_cond_max_scale_0_01mm - air_cond_scale_step*cnt;
   }else{
       attr.value = 0;
   }


    air_cond_set_attr(idx, &attr); 


// 0x0030	温度
    attr.iot_id =0x0030;
    attr.value = 20 + (cnt&0x0F);
    air_cond_set_attr(idx, &attr); 
 
    cnt++;

}




//void air_cond_update_tick_min(uint8_t idx,uint8_t pattr_size,IotModel* pattr )
////刷新节点运行数据
void air_cond_update_tick_min(uint8_t idx,int8_t temper ,uint32_t air_cond )
{
  IotModel attr;
  memset(&attr, 0,  sizeof(IotModel) );

   LOG_NAME();



    if( idx > AIR_COND_NODE_NUM_MAX )
    {
       logout("error:air_cond idx outof range\n"); 
       return ;
    }



/*---------这里添加报警逻辑------------------------
#if 0
air_cond_attr_t*  pattr=air_cond_get_obj( idx) ; 


  
// 0x0500	烟雾报警信息
    // attr.iot_id =0x0500;
    // attr.value =0x0000;
    // air_cond_set_attr(idx, &attr); 

//---------这里添加报警逻辑------------------------

    if( temper>=pattr->config.over_temper_th )
    {
        pattr->data.alarm.bit.over_temper = 1;

    }else if( temper<=pattr->config.under_temper_th )
    {
        pattr->data.alarm.bit.under_temper = 1;
            
    }else{
        pattr->data.alarm.bit.over_temper  = 0;
        pattr->data.alarm.bit.under_temper = 0;
    }


    if( air_cond>=pattr->config.over_level_th )
    {
        pattr->data.alarm.bit.over_level = 1;

    }else if( air_cond<=pattr->config.under_level_th )
    {
        pattr->data.alarm.bit.under_level = 1;
            
    }else{
        pattr->data.alarm.bit.over_level  = 0;
        pattr->data.alarm.bit.under_level = 0;
    }

   pattr = NULL;   

#endif

---------这里添加报警逻辑------------------------*/



// 0x0501	烟雾
    attr.iot_id =0x0501;
    attr.value = air_cond;
    air_cond_set_attr(idx, &attr); 


// 0x0030	温度
    attr.iot_id =0x0030;
    attr.value  = temper;////负温度的时候有问题----还需要进一步处理
    air_cond_set_attr(idx, &attr); 
 
}







////刷新节点运行数据
void air_cond_obj_update(uint8_t idx,air_cond_attr_t* pliq_in  )
{
  IotModel attr;
  memset(&attr, 0,  sizeof(IotModel) );

   LOG_NAME();

    if( idx > AIR_COND_NODE_NUM_MAX )
    {
       logout("error:air_cond idx outof range\n"); 
       return ;
    }


    if( NULL==pliq_in )
    {
       logout("error:pliq_in==NULL\n"); 
       return ;
    }



//#if 0
air_cond_attr_t*  pattr=air_cond_get_obj( idx) ; 

 ////-----保存节点数据到物模型------
      *pattr = *pliq_in;

 //-----同步节点数据到 白名单--------
   iot_set_device_online_state_with_index(idx,  pliq_in->flags.bit.online );   ////同步节点在线标志到 白名单-----

 //-----还有其它数据需要同步到 白名单----通道编号--通道地址???----





#if 0
// 0x0500	烟雾报警信息
    // attr.iot_id =0x0500;
    // attr.value =0x0000;
    // air_cond_set_attr(idx, &attr); 

//---------这里添加报警逻辑------------------------

    if( temper>=pattr->config.over_temper_th )
    {
        pattr->data.alarm.bit.over_temper = 1;

    }else if( temper<=pattr->config.under_temper_th )
    {
        pattr->data.alarm.bit.under_temper = 1;
            
    }else{
        pattr->data.alarm.bit.over_temper  = 0;
        pattr->data.alarm.bit.under_temper = 0;
    }


    if( air_cond>=pattr->config.over_level_th )
    {
        pattr->data.alarm.bit.over_level = 1;

    }else if( air_cond<=pattr->config.under_level_th )
    {
        pattr->data.alarm.bit.under_level = 1;
            
    }else{
        pattr->data.alarm.bit.over_level  = 0;
        pattr->data.alarm.bit.under_level = 0;
    }

   pattr = NULL;   

//#endif


// 0x0501	烟雾
    attr.iot_id =0x0501;
    attr.value = air_cond;
    air_cond_set_attr(idx, &attr); 


// 0x0030	温度
    attr.iot_id =0x0030;
    attr.value  = temper;////负温度的时候有问题----还需要进一步处理
    air_cond_set_attr(idx, &attr); 
 
#endif


}













